#pragma once

#include "Command.hpp"
#include <iostream>
#include <unistd.h>
#include <cstdio>
#include <sys/types.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>

const std::string dev = "/dev/null";
// 守护进程化
void Daemon(int nochdir = 0, int noclose = 0)
{
    // 忽略信号，IO
    // 父进程直接结束
    if (fork() > 0)
    {
        exit(OK);
    }
    // 成为新会话
    setsid();
    // 可能和键盘显示器，stdin，stdout，stderr相关联
    // 打开 /dev/null 这个文件 ，重定向标准输入输出err到这个文件
    if (nochdir == 0)
    {
        ::chdir("/");
    }
    if (noclose == 0)
    {
        int fd = ::open(dev.c_str(), O_RDWR);
        if (fd < 0)
        {
            std::cout << "打开/dev/null失败，守护进程失败" << std::endl;
            exit(OPEN_ERR);
        }
        else
        {
            dup2(fd, 0);
            dup2(fd, 1);
            dup2(fd, 2);
            close(fd);
        }
    }
};